/* 
 * Author: apleilx
 *
 * Created on 2015年10月9日, 上午10:07
 */

#ifndef SIMP_LOG_M_H
#define	SIMP_LOG_M_H

#include "stdint.h"
#include "rtctime.h"

#ifdef	__cplusplus
extern "C" {
#endif	

typedef struct 
{
    uint32_t blocks;
    uint32_t blocks_per_page;
    uint32_t site_start;
    uint32_t site_next;
} simp_log_info_type;

typedef struct 
{
    uint32_t addr_base;                          //必须对齐page_size边界
    uint32_t total_size;                         //必须为page_size的整数倍，且至少为4倍
    uint16_t page_size;                          //必须为2^n
    uint16_t dat_size;                           //必须为2^n，且最小为4
    void *pdat;                                  //必须为4字节对齐的地址
    simp_log_info_type * info;
    void (*Erase)(uint32_t AddrBase);                /*擦除*/
    void (*Program)(uint32_t Addr, uint32_t dat);    /*编程一字*/
    uint32_t (*Read)(uint32_t Addr);                 /*读取一字*/
} simp_log_type;


void simp_log_save(const simp_log_type * cfg);
void simp_log_save_verify(const simp_log_type * cfg);
void simp_log_init(const simp_log_type * cfg);
void simp_log_read(const simp_log_type * cfg, uint32_t site, void *pdat);
int32_t simp_log_site_fore(const simp_log_type * cfg, int32_t site, int32_t fore_amount);

/*-----------------------------------------------------------------------------------------------------*
 * 快速搜索，内部采用二分搜索法，从start到next-1区间
 * mode: 0(未命中目标时返回-1)，-1(未命中目标时返回小于目标值的位置)，1(未命中目标时返回大于目标值的位置)
 * return 返回-1代表未搜到指定结果， +数指向搜索结果位置
 *-----------------------------------------------------------------------------------------------------*/
int32_t simp_log_quick_search(const simp_log_type * cfg, sig_time_type time, int8_t mode);

#ifdef	__cplusplus
}
#endif

#endif	/* SIMP_LOG_M_H */
